﻿using QuanLyThuVien.DAL;
using QuanLyThuVien.DTO;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace QuanLyThuVien.BLL
{
    //----------------------------------------------------------------------
    //Desc: class xử lý cho bảng PHIEUMUON
    //----------------------------------------------------------------------
    public class BLLPhieuMuon
    {
        //----------------------------------------------------------------------
        //Desc: constructor mặc định
        //----------------------------------------------------------------------
        public BLLPhieuMuon()
        { 
        }

        //----------------------------------------------------------------------
        //Desc: lấy danh sách Phiếu Mượn
        //----------------------------------------------------------------------
        public DataTable LayDanhSachPhieuMuon()
        {
            DALPhieuMuon _dalPhieuMuon = new DALPhieuMuon();
            return _dalPhieuMuon.LayDanhSachPhieuMuon();
        }

        //----------------------------------------------------------------------
        //Desc: Lấy Phiếu Mượn
        //----------------------------------------------------------------------
        public DTOPhieuMuon LayPhieuMuon(string maphieumuon)
        {
            DALPhieuMuon _dalPhieuMuon = new DALPhieuMuon();
            DTOPhieuMuon phieumuon = _dalPhieuMuon.LayPhieuMuon(maphieumuon);
            if (phieumuon == null)
                return null;

            DALDocGia _dalDocGia = new DALDocGia();
            DTODocGia docgia = _dalDocGia.LayThongTinDG(phieumuon.DocGia.MaDG);
            if (docgia == null)
                return null;

            DALCT_PhieuMuon _dalCT_PhieuMuon = new DALCT_PhieuMuon();
            List<DTOCT_PhieuMuon> list = _dalCT_PhieuMuon.LayDanhSachCT_PhieuMuon(phieumuon.MaPhieuMuon);
            if (list == null)
                return null;

            phieumuon.DocGia = docgia;
            phieumuon.DSCTPhieuMuon = list;
            return phieumuon;
        }

        //----------------------------------------------------------------------
        //Desc: cập nhật phiếu mượn
        //----------------------------------------------------------------------
        public bool CapNhat(DTOPhieuMuon phieumuon)
        {
            DALPhieuMuon _dalPhieuMuon = new DALPhieuMuon();
            return _dalPhieuMuon.CapNhat(phieumuon);
        }

        //----------------------------------------------------------------------
        //Desc: kiểm tra ngày hết hạn
        //----------------------------------------------------------------------
        public bool KiemTraNgayHetHan(DTOPhieuMuon phieumuon)
        {
            DALDocGia _dalDocGia = new DALDocGia();

            DTODocGia docgia = _dalDocGia.LayThongTinDG(phieumuon.DocGia.MaDG);

            if (docgia == null)
            {
                MessageBox.Show("Không tìm thấy độc giả");
                return false;
            }
            else
            {
                if (docgia.NgayHetHan < phieumuon.NgayMuon)
                {
                    MessageBox.Show("Thẻ độc giả đã hết hạn");
                    return false;
                }
                else
                    return true;
            }
        }

        //----------------------------------------------------------------------
        //Desc: kiểm tra quy định
        //----------------------------------------------------------------------
        public bool KiemTraQD(DTOPhieuMuon phieumuon)
        {
            DALPhieuMuon _dalPhieuMuon = new DALPhieuMuon();
            DALQuyDinh _dalQuyDinh = new DALQuyDinh();

            int sosachmuontd = _dalQuyDinh.LaySoSachMuonTD();
            if (sosachmuontd < 0)
            {
                MessageBox.Show("Không lấy được quy định sách mượn tối đa");
                return false;
            }
            List<DTOCT_PhieuMuon> list  = _dalPhieuMuon.LayDSSachDangMuon(phieumuon.DocGia.MaDG);
            if (list == null)
            {
                MessageBox.Show("Không lấy được ds sách đang mượn của độc giả");
                return false;
            }

            //giới hạn số sách mượn
            if (list.Count >= sosachmuontd)
            {
                MessageBox.Show("Mỗi độc giả chỉ mượn tối đa " + sosachmuontd.ToString() + " sách");
                return false;
            }

            //không có sách mượn quá hạn
            for (int i = 0; i < list.Count; i++)
            {
                object obj = _dalPhieuMuon.LayNgayHetHan(list[i].MaPhieuMuon);
                if (obj == null)
                    return false;
                else
                {
                    DateTime ngayhethan = new DateTime();
                    try
                    {
                        ngayhethan = (DateTime)obj;
                    }
                    catch
                    {
                        MessageBox.Show("Không lấy được ngày hết hạn");
                        return false;
                    }

                    //thư viện tiếp nhận sách trả đến 18h
                    ngayhethan = ngayhethan.AddHours(18);
                    if (ngayhethan < DateTime.Now)
                    {
                        MessageBox.Show("Độc giả có sách mượn quá hạn");
                        return false;
                    }
                }
            }

            return true;
        }

        //----------------------------------------------------------------------
        //Desc: phát sinh mã phiếu mượn
        //----------------------------------------------------------------------
        public bool PhatSinhMaPhieuMuon(ref DTOPhieuMuon phieumuon)
        {
            DALPhieuMuon _dalPhieuMuon = new DALPhieuMuon();

            int stt = _dalPhieuMuon.DemSoPhieuMuon();
            if (stt < 0)
                return false;
            if (stt == 0)
                stt++;

            string maphieu = "PMU" + stt.ToString("D3");
            int dem = _dalPhieuMuon.DemMaPhieuMuon(maphieu);

            //có thể xảy ra vòng lặp vô hạn
            while (dem > 0)
            {
                stt++;
                maphieu = "PMU" + stt.ToString("D3");
                dem = _dalPhieuMuon.DemMaPhieuMuon(maphieu);
            }

            if (dem < 0)
                return false;

            phieumuon.MaPhieuMuon = maphieu;
            return true;
        }

        //----------------------------------------------------------------------
        //Desc: tính ngày hết hạn
        //----------------------------------------------------------------------
        public bool TinhNgayHetHan(ref DTOPhieuMuon phieumuon)
        {
            DALQuyDinh _dalQuyDinh = new DALQuyDinh();
            int songaymuontd = _dalQuyDinh.LaySongayMuonTD();
            if (songaymuontd < 0)
            {
                MessageBox.Show("Không lấy được quy định số ngày mượn tối đa");
                return false;
            }
            else
            {
                try
                {
                    phieumuon.NgayHetHan = phieumuon.NgayMuon.AddDays(songaymuontd);
                }
                catch
                {
                    return false;
                }

                return true;
   
            }
        }

        //----------------------------------------------------------------------
        //Desc: lấy ngày mượn
        //----------------------------------------------------------------------
        public object LayNgayMuon(string maphieumuon)
        {
            DALPhieuMuon _dalPhieuMuon = new DALPhieuMuon();
            return _dalPhieuMuon.LayNgayMuon(maphieumuon);
        }

        //----------------------------------------------------------------------
        //Desc: lấy ngày hết hạn
        //----------------------------------------------------------------------
        public object LayNgayHetHan(string maphieumuon)
        {
            DALPhieuMuon _dalPhieuMuon = new DALPhieuMuon();
            return _dalPhieuMuon.LayNgayHetHan(maphieumuon);
        }

        //----------------------------------------------------------------------
        //Desc: Lấy danh sách Sách mượn trong tháng
        //----------------------------------------------------------------------
        public List<DTOCuonSach> LaySachMuonTrongThang(int thang, long nam)
        {
            DALPhieuMuon _dalPhieuMuon = new DALPhieuMuon();
            return _dalPhieuMuon.LaySachMuonTrongThang(thang, nam);
        }

        //----------------------------------------------------------------------
        //Desc: Lấy danh sách Sách đang mượn của độc giả
        //----------------------------------------------------------------------
        public List<DTOCT_PhieuMuon> LayDSSachDangMuon(string madg)
        {
            DALPhieuMuon _dalPhieuMuon = new DALPhieuMuon();
            return _dalPhieuMuon.LayDSSachDangMuon(madg);
        }

        //----------------------------------------------------------------------
        //Desc: Lấy danh sách Sách trả trễ
        //----------------------------------------------------------------------
        public List<DTOCT_PhieuMuon> LayDSSachTraTre(DateTime ngaylay)
        {
            DALPhieuMuon _dalPhieuMuon = new DALPhieuMuon();
            return _dalPhieuMuon.LayDSSachTraTre(ngaylay);
        }

        //----------------------------------------------------------------------
        //Desc: Lấy danh sách các phiếu mượn của độc giả
        //----------------------------------------------------------------------
        public DataTable LayPhieuMuonDocGia(string madocgia)
        {
            DALPhieuMuon _dalPhieuMuon = new DALPhieuMuon();
            return _dalPhieuMuon.LayPhieuMuonDocGia(madocgia);
        }

        //----------------------------------------------------------------------
        //Desc: đếm số sách đang mượn của độc giả
        //----------------------------------------------------------------------
        public int DemSoSachDangMuon(string madocgia)
        {
            DALPhieuMuon _dalPhieuMuon = new DALPhieuMuon();
            return _dalPhieuMuon.DemSoSachDangMuon(madocgia);
        }
    }
}
